home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / magazyn_amiga / 2 / ami044a_kurs_c.list < prev    next >
Text File  |  1997-09-14  |  3KB  |  237 lines

  1. /* Listing 10 */
  2.  
  3.  
  4.  
  5. #include <intuition/intuition.h>
  6.  
  7.  
  8.  
  9. #include <proto/diskfont.h>
  10.  
  11. #include <proto/exec.h>
  12.  
  13. #include <proto/graphics.h>
  14.  
  15. #include <proto/intuition.h>
  16.  
  17.  
  18.  
  19. #include <string.h>
  20.  
  21.  
  22.  
  23. #define W(r) ((r).MaxX - (r).MinX)
  24.  
  25. #define H(r) ((r).MaxY - (r).MinY)
  26.  
  27.  
  28.  
  29. struct IntuitionBase *IntuitionBase;
  30.  
  31. struct GfxBase *GfxBase;
  32.  
  33. struct Library *DiskfontBase;
  34.  
  35.  
  36.  
  37. void border(struct RastPort *rp, struct Rectangle *r);
  38.  
  39.  
  40.  
  41. struct TagItem mytags[]={{TA_DeviceDPI, 5<<16 | 4}, TAG_DONE};
  42.  
  43. struct TTextAttr tta={0, 0, FS_NORMAL | FSF_TAGGED, FPF_DISKFONT, mytags};
  44.  
  45.  
  46.  
  47. int main(int argc, char *argv[])
  48.  
  49. {
  50.  
  51.     check_os(OS_20);
  52.  
  53.     if (argc!=2)
  54.  
  55.         return 10; /* Brak argumentu */
  56.  
  57.     IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library", 37);
  58.  
  59.     GfxBase=(struct GfxBase*)OpenLibrary("graphics.library", 37);
  60.  
  61.  
  62.  
  63.     if (DiskfontBase=OpenLibrary("diskfont.library", 36))
  64.  
  65.     {
  66.  
  67.         struct Window *window;
  68.  
  69.         if (window=OpenWindowTags(0, WA_Flags, WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_DEPTHGADGET | WFLG_ACTIVATE | WFLG_RMBTRAP, WA_IDCMP, IDCMP_CLOSEWINDOW, WA_Title, "Test czcionek czyli fontów.", TAG_END))
  70.  
  71.         {
  72.  
  73.             struct TextFont *tf;
  74.  
  75.             struct TextExtent te;
  76.  
  77.             struct Rectangle miejsce;
  78.  
  79.             long len, error=FALSE;
  80.  
  81.  
  82.  
  83.             miejsce.MinX=window->BorderLeft;
  84.  
  85.             miejsce.MinY=window->BorderTop;
  86.  
  87.             miejsce.MaxX=window->Width-window->BorderRight;
  88.  
  89.             miejsce.MaxY=window->Height-window->BorderBottom;
  90.  
  91.  
  92.  
  93.             tta.tta_Name=argv[1];
  94.  
  95.  
  96.  
  97.             for (tta.tta_YSize=H(miejsce)/2; tta.tta_YSize>=4 && W(miejsce)>2 && H(miejsce)>=2+tta.tta_YSize && !error; tta.tta_YSize>>=1)
  98.  
  99.             {
  100.  
  101.                 do
  102.  
  103.                 {
  104.  
  105.                     if (tf=OpenDiskFont((struct TextAttr*)&tta))
  106.  
  107.                     {
  108.  
  109.                         SetFont(window->RPort, tf); /* Podîâczenie czcionki do RP */
  110.  
  111.                         SetSoftStyle(window->RPort, tta.tta_Style, AskSoftStyle(window->RPort));
  112.  
  113.  
  114.  
  115.                         if (len=TextFit(window->RPort, argv[1], strlen(argv[1]), &te, NULL, 1, W(miejsce)-2, H(miejsce)-2))
  116.  
  117.                         {
  118.  
  119.                             Move(window->RPort, miejsce.MinX-te.te_Extent.MinX+1, miejsce.MinY-te.te_Extent.MinY+1);
  120.  
  121.                             miejsce.MinX+=2+W(te.te_Extent);
  122.  
  123.  
  124.  
  125.                             if (W(miejsce)>=2) /* rysujemy tylko gdy jest miejsce */
  126.  
  127.                             {
  128.  
  129.                                 te.te_Extent.MinX--;
  130.  
  131.                                 te.te_Extent.MinY--;
  132.  
  133.                                 te.te_Extent.MaxX++;
  134.  
  135.                                 te.te_Extent.MaxY++;
  136.  
  137.  
  138.  
  139.                                 SetAPen(window->RPort, 3);
  140.  
  141.                                 border(window->RPort, &te.te_Extent);
  142.  
  143.  
  144.  
  145.                                 SetAPen(window->RPort, 1);
  146.  
  147.                                 Text(window->RPort, argv[1], len);
  148.  
  149.  
  150.  
  151.                                 tta.tta_Style++; /* Nastëpny styl */
  152.  
  153.                                 tta.tta_Style &= FSF_ITALIC | FSF_BOLD | FSF_UNDERLINED | FSF_TAGGED;
  154.  
  155.                             }
  156.  
  157.                         }
  158.  
  159.                         CloseFont(tf);
  160.  
  161.                     }
  162.  
  163.                     else
  164.  
  165.                         error=TRUE;
  166.  
  167.  
  168.  
  169.                 } while (len && !error && W(miejsce)>0);
  170.  
  171.  
  172.  
  173.                 miejsce.MinY+=tta.tta_YSize+2;
  174.  
  175.                 miejsce.MinX=window->BorderLeft;
  176.  
  177.             }
  178.  
  179.             if (!error)
  180.  
  181.                  WaitPort(window->UserPort); /* Czekamy na klikniëcie na gadûet zamykania */
  182.  
  183.             CloseWindow(window);
  184.  
  185.         }
  186.  
  187.         CloseLibrary(DiskfontBase);
  188.  
  189.     }
  190.  
  191.     CloseLibrary((struct Library*)GfxBase);
  192.  
  193.     CloseLibrary((struct Library*)IntuitionBase);
  194.  
  195.  
  196.  
  197.     return 0;
  198.  
  199. }
  200.  
  201.  
  202.  
  203. void border(struct RastPort *rp, struct Rectangle *r)
  204.  
  205. {
  206.  
  207. #define X rp->cp_x
  208.  
  209. #define Y rp->cp_y
  210.  
  211.  
  212.  
  213.     Move(rp, X+r->MinX, Y+r->MinY);
  214.  
  215.  
  216.  
  217.     Draw(rp, X-r->MinX+r->MaxX, Y); 
  218.  
  219.     Draw(rp, X, Y-r->MinY+r->MaxY);
  220.  
  221.     Draw(rp, X+r->MinX-r->MaxX, Y);
  222.  
  223.     Draw(rp, X, Y+r->MinY-r->MaxY);
  224.  
  225.  
  226.  
  227.     Move(rp, X-r->MinX, Y-r->MinY);
  228.  
  229.  
  230.  
  231. #undef X
  232.  
  233. #undef Y
  234.  
  235. }
  236.  
  237.